package com.foreveross.project.usercenterserver.oauth2.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import com.foreveross.project.usercenterserver.domain.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Date;

/**
 * <p>
 * <p>
 * </p>
 *
 * @author yz
 * @since 2019-07-19
 */
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("uc_tenant")
public class UcTenant extends BaseEntity {

    private static final long serialVersionUID = 1L;



    /**
     * 备注
     */
    private String description;

    /**
     * 排序
     */
    private int sort;

    /**
     * 版本
     */
    private int version;

    /**
     设定客户端的access_token的有效时间值(单位:秒),可选, 若不设定值则使用默认的有效时间值(60 * 60 * 12, 12小时).在服务端获取的access_token JSON数据中的expires_in字段的值即为当前access_token的有效时间值.
     在项目中, 可具体参考DefaultTokenServices.java中属性accessTokenValiditySeconds.
     在实际应用中, 该值一般是由服务端处理的, 不需要客户端自定义.
     */
    private int accessTokenValidity;

    /**
     * 这是一个预留的字段,在Oauth的流程中没有实际的使用,可选,但若设置值,必须是JSON格式的数据,如:
     {"country":"CN","country_code":"086"}
     按照spring-security-oauth项目中对该字段的描述
     Additional information for this client, not need by the vanilla OAuth protocol but might be useful, for example,for storing descriptive information.
     (详见ClientDetails.java的getAdditionalInformation()方法的注释)
     在实际应用中, 可以用该字段来存储关于客户端的一些其他信息,如客户端的国家,地区,注册时的IP地址等等.
     */
    private String additionalInformation;

    /**
     * 应用名称
     */
    private String tenantName;

    /**
     * 指定客户端所拥有的Spring Security的权限值,可选, 若有多个权限值,用逗号(,)分隔, 如: "ROLE_UNITY,ROLE_USER".
     对于是否要设置该字段的值,要根据不同的grant_type来判断, 若客户端在Oauth流程中需要用户的用户名(username)与密码(password)的(authorization_code,password),
     则该字段可以不需要设置值,因为服务端将根据用户在服务端所拥有的权限来判断是否有权限访问对应的API.
     但如果客户端在Oauth流程中不需要用户信息的(implicit,client_credentials),
     则该字段必须要设置对应的权限值, 因为服务端将根据该字段值的权限来判断是否有权限访问对应的API.
     */
    private String authorities;

    /**
     *
     * 指定客户端支持的grant_type,可选值包括authorization_code,password,refresh_token,implicit,client_credentials, 若支持多个grant_type用逗号(,)分隔,如: "authorization_code,password".
     在实际应用中,当注册时,该字段是一般由服务器端指定的,而不是由申请者去选择的,最常用的grant_type组合有: "authorization_code,refresh_token"(针对通过浏览器访问的客户端); "password,refresh_token"(针对移动设备的客户端).
     implicit与client_credentials在实际中很少使用.
     */
    private String authorizedGrantTypes;

    /**
     * 设置用户是否自动Approval操作, 默认值为 'false', 可选值包括 'true','false', 'read','write'.
     该字段只适用于grant_type="authorization_code"的情况,当用户登录成功后,若该值为'true'或支持的scope值,则会跳过用户Approve的页面, 直接授权.
     */
    private String autoApprove;

    /**
     * 客户端id
     */
    private String clientId;

    /**
     *
     用于指定客户端(client)的访问密匙; 在注册时必须填写(也可由服务端自动生成).
     对于不同的grant_type,该字段都是必须的. 在实际应用中的另一个名称叫appSecret,与client_secret是同一个概念.
     */
    private String clientSecret;

    /**
     * 过期时间
     */
    private Date expirationDate;

    /**
     *设定客户端的refresh_token的有效时间值(单位:秒),可选, 若不设定值则使用默认的有效时间值(60 * 60 * 24 * 30, 30天).
     若客户端的grant_type不包括refresh_token,则不用关心该字段
     */
    private int refreshTokenValidity;

    /**
     * 客户端所能访问的资源id集合,多个资源时用逗号(,)分隔
     */
    private String resourceIds;

    /**
     * 指定客户端申请的权限范围,可选值包括read,write,trust;若有多个权限范围用逗号(,)分隔,如: "read,write".
     */
    private String scope;

    /**
     * 客户端的重定向URI,可为空, 当grant_type为authorization_code或implicit时, 在Oauth的流程中会使用并检查与注册时填写的redirect_uri是否一致
     */
    private String webServerRedirectUri;

    /**
     * uuid
     */
    private String tenantFkId;


}
